#include "threadPool.h"

// 1. 任务提交接口
void ThreadPool::enQueueTask(const Task &task)
{
    std::unique_lock<std::mutex> lock(_queueMutex); // 加锁
    _tasks.push(task);                              // 添加任务到队列
    _condition.notify_one();                        // 通知一个等待的线程
}

// 2. 线程同步机制和任务执行
void ThreadPool::workerThread()
{
    while (true)
    {
        Task task;
        {
            std::unique_lock<std::mutex> lock(_queueMutex);
            _condition.wait(lock, [this]
                            { return !_tasks.empty() || _stop; });
            if (_stop && _tasks.empty())
            {
                return; // 线程池停止且任务队列为空，退出线程
            }
            task = std::move(_tasks.front()); // 获取任务
            _tasks.pop();                     // 移除任务
        }
        task(); // 执行任务
    }
}

// 3. 启动线程池
ThreadPool::ThreadPool(size_t numbers)
    : _stop(false)
{
    for (size_t i = 0; i < numbers; ++i)
    {
        _workers.emplace_back(std::bind(&ThreadPool::workerThread, this)); // 创建工作线程
    }
}

// 4. 关闭线程池清理资源
ThreadPool::~ThreadPool()
{
    {
        std::unique_lock<std::mutex> lock(_queueMutex);
        _stop = true; // 设置停止标志
    }
    _condition.notify_all(); // 通知所有线程
    for (std::thread &worker : _workers)
    {
        if (worker.joinable()) // 确保线程可连接
        {
            worker.join(); // 等待所有线程完成
        }
    }
}